Русская справка по Delphi 5
Мастерская Delphi программирования.
Главная Мастерская Архив Ссылки Отдых Для гостей  
Секреты VCL Секреты API            

Проблема c "завершением работы" windows

пример: Shutdown.zip

При работе программы может сложиться следующая ситуация. Программа работает но по какой-то притчине пользователь завершает работу windows или другая программа вызывает функцию ExitWindows. В результате Windows попытается завершить свою работу но вскоре прекратит попытку и будет продолжать работать.

Это происходит потому что, при вызове функци завершения работы, ExitWindows или ExitWindowsEx, каждой программе посылается сообщение Wm_QueryEndSession. Обрабатывая это сообщение, программа должна выполнит действия по подготовке к завершению, и вернуть True. Если любая из программ вернет False, система не будет завершать свою работу.

Не вдаваясь в подробности VCL можно поступить проще определив для сообщения Wm_QueryEndSession обработчик в потомке TForm.


..
  private
    { Private declarations }
    procedure WmQueryEndSession(var Message: TWmQueryEndSession); message wm_QueryEndSession;
..

Реализовать обработчик можно следующим образом


..

implementation

procedure TForm1.WmQueryEndSession(var Message: TWmQueryEndSession);
var i:Integer;
begin
 i:=0;
 repeat
  inc(i);
 until i = 900000000;
 {заставить Windows подождать.
 здесь можно выполнить код подготовки к завершению работы программы}
 Close;
 {закрыть программу. Все равно "завершение работы"}
end;
..
Windows будет ждать пока программа не обработает сообщение.

Как это работает можно посмотреть запустив пример

P.S.По моим наблюдениям все программы написанные на Delphi не дают "завершить работу" если не обрабатывать wm_QueryEndSession. Поправте меня если это не так.


Главная Мастерская Архив Ссылки Отдых Для гостей  
Секреты VCL Секреты API            
Дизайн и программирование - Valler© ,2000,2001.
http://www.valler.narod.ru
Используются технологии uCoz